/*
 * test_ini.c
 *
 * 用于测试INI配置文件解析器的功能
 *
 * Created on: 2025/08/26
 *      Author: C Developer
 */

#include "c_ini/c_ini.h"
#include <stdio.h>
#include <string.h>

/* 测试函数：创建和保存INI文件 */
void test_create_and_save(void)
{
    printf("=== 测试创建和保存INI文件 ===\n");
    
    // 创建解析器
    ini_parser_t *parser = ini_create_parser();
    if (parser == NULL) {
        printf("创建解析器失败\n");
        return;
    }
    
    // 设置配置项
    ini_set_string(parser, "database", "host", "localhost");
    ini_set_int(parser, "database", "port", 3306);
    ini_set_string(parser, "database", "user", "root");
    ini_set_string(parser, "database", "password", "password123");
    
    ini_set_int(parser, "server", "max_connections", 100);
    ini_set_boolean(parser, "server", "debug_mode", 1);
    ini_set_double(parser, "server", "timeout", 30.5);
    
    ini_set_string(parser, "logging", "level", "info");
    ini_set_string(parser, "logging", "file", "/var/log/app.log");
    
    // 保存到文件
    int result = ini_save_file(parser, "test_config.ini");
    if (result == INI_OK) {
        printf("保存INI文件成功\n");
    } else {
        printf("保存INI文件失败，错误码：%d\n", result);
    }
    
    // 释放解析器
    ini_destroy_parser(parser);
}

/* 测试函数：加载和读取INI文件 */
void test_load_and_read(void)
{
    printf("\n=== 测试加载和读取INI文件 ===\n");
    
    // 创建解析器
    ini_parser_t *parser = ini_create_parser();
    if (parser == NULL) {
        printf("创建解析器失败\n");
        return;
    }
    
    // 加载文件
    int result = ini_load_file(parser, "test_config.ini");
    if (result != INI_OK) {
        printf("加载INI文件失败，错误码：%d\n", result);
        ini_destroy_parser(parser);
        return;
    }
    
    // 读取配置项
    printf("database.host = %s\n", ini_get_string(parser, "database", "host", "default"));
    printf("database.port = %d\n", ini_get_int(parser, "database", "port", 0));
    printf("database.user = %s\n", ini_get_string(parser, "database", "user", "default"));
    printf("database.password = %s\n", ini_get_string(parser, "database", "password", "default"));
    
    printf("server.max_connections = %d\n", ini_get_int(parser, "server", "max_connections", 0));
    printf("server.debug_mode = %d\n", ini_get_boolean(parser, "server", "debug_mode", 0));
    printf("server.timeout = %lf\n", ini_get_double(parser, "server", "timeout", 0.0));
    
    printf("logging.level = %s\n", ini_get_string(parser, "logging", "level", "default"));
    printf("logging.file = %s\n", ini_get_string(parser, "logging", "file", "default"));
    
    // 测试不存在的配置项
    printf("不存在的配置项：%s\n", ini_get_string(parser, "database", "nonexistent", "默认值"));
    
    // 测试节和键是否存在
    printf("节'database'是否存在：%d\n", ini_has_section(parser, "database"));
    printf("节'nonexistent'是否存在：%d\n", ini_has_section(parser, "nonexistent"));
    printf("键'database.host'是否存在：%d\n", ini_has_key(parser, "database", "host"));
    printf("键'database.nonexistent'是否存在：%d\n", ini_has_key(parser, "database", "nonexistent"));
    
    // 测试获取所有节
    printf("\n所有节：\n");
    char *sections[10];
    int section_count = ini_get_all_sections(parser, sections, 10);
    for (int i = 0; i < section_count; i++) {
        printf("- %s\n", sections[i]);
    }
    
    // 测试获取指定节下的所有键
    printf("\n节'database'下的所有键：\n");
    char *keys[10];
    int key_count = ini_get_all_keys(parser, "database", keys, 10);
    for (int i = 0; i < key_count; i++) {
        printf("- %s\n", keys[i]);
    }
    
    // 释放解析器
    ini_destroy_parser(parser);
}

/* 测试函数：修改和删除INI文件内容 */
void test_modify_and_delete(void)
{
    printf("\n=== 测试修改和删除INI文件内容 ===\n");
    
    // 创建解析器
    ini_parser_t *parser = ini_create_parser();
    if (parser == NULL) {
        printf("创建解析器失败\n");
        return;
    }
    
    // 加载文件
    int result = ini_load_file(parser, "test_config.ini");
    if (result != INI_OK) {
        printf("加载INI文件失败，错误码：%d\n", result);
        ini_destroy_parser(parser);
        return;
    }
    
    // 修改配置项
    printf("修改database.port从%d到%d\n", 
           ini_get_int(parser, "database", "port", 0), 5432);
    ini_set_int(parser, "database", "port", 5432);
    
    // 删除配置项
    printf("删除database.password\n");
    ini_delete_key(parser, "database", "password");
    
    // 添加新的配置项
    printf("添加新的配置项database.ssl = true\n");
    ini_set_boolean(parser, "database", "ssl", 1);
    
    // 删除整个节
    printf("删除节'logging'\n");
    ini_delete_section(parser, "logging");
    
    // 保存修改后的内容
    result = ini_save_file(parser, "modified_config.ini");
    if (result == INI_OK) {
        printf("保存修改后的INI文件成功\n");
    } else {
        printf("保存修改后的INI文件失败，错误码：%d\n", result);
    }
    
    // 释放解析器
    ini_destroy_parser(parser);
}

/* 测试函数：从内存加载INI内容 */
void test_load_from_memory(void)
{
    printf("\n=== 测试从内存加载INI内容 ===\n");
    
    // 创建解析器
    ini_parser_t *parser = ini_create_parser();
    if (parser == NULL) {
        printf("创建解析器失败\n");
        return;
    }
    
    // 定义内存中的INI内容
    const char *ini_content = 
        "[app]\n" 
        "name = TestApp\n" 
        "version = 1.0.0\n" 
        "author = Developer\n" 
        "\n" 
        "[settings]\n" 
        "theme = dark\n" 
        "language = en\n";
    
    // 从内存加载
    int result = ini_load_memory(parser, ini_content, strlen(ini_content));
    if (result != INI_OK) {
        printf("从内存加载INI内容失败，错误码：%d\n", result);
        ini_destroy_parser(parser);
        return;
    }
    
    // 读取配置项
    printf("app.name = %s\n", ini_get_string(parser, "app", "name", "default"));
    printf("app.version = %s\n", ini_get_string(parser, "app", "version", "default"));
    printf("settings.theme = %s\n", ini_get_string(parser, "settings", "theme", "default"));
    printf("settings.language = %s\n", ini_get_string(parser, "settings", "language", "default"));
    
    // 释放解析器
    ini_destroy_parser(parser);
}

int main(void)
{
    printf("INI配置文件解析器测试\n");
    printf("======================\n\n");
    
    // 运行各个测试函数
    test_create_and_save();
    test_load_and_read();
    test_modify_and_delete();
    test_load_from_memory();
    
    printf("\n测试完成\n");
    return 0;
}